﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using SouthApps.MobileHealthService.Model.Entities;
using SouthApps.MobileHealth.SDK.DAL.Model;

namespace SouthApps.MobileHealth.MobileHealthService.Common
{
    public static class EntityTranslator
    {
        public static PrestadorDto GetPrestadorDto(Prestador prestador)
        {
            PrestadorDto prestadorDto = new PrestadorDto();
            prestadorDto.PrestadorId = prestador.prestadorId;
            prestadorDto.FinanciadorId = prestador.financiador.financiadorId;
            prestadorDto.Nombre = prestador.nombre;
            prestadorDto.RazonSocial = prestador.razonSocial;
            prestadorDto.Cuit = prestador.cuit;

            return prestadorDto;
        }

        public static FinanciadorDto GetFinanciadorDto(Financiador financiador)
        {
            FinanciadorDto financiadorDto = new FinanciadorDto();
            financiadorDto.FinanciadorId = financiador.financiadorId;
            financiadorDto.PaisNombre = financiador.pais.nombre;
            financiadorDto.Nombre = financiador.nombre;
            financiadorDto.RazonSocial = financiador.razonSocial;
            financiadorDto.Cuit = financiador.cuit;
            financiadorDto.Direccion = financiador.direccion;
            financiadorDto.Telefono = financiador.telefono;
            financiadorDto.TelefonoUrgencia = financiador.telefonourgencia;
            
            return financiadorDto;
        }

        public static PermissionDto GetPermissionDto(Permission permission)
        {
            PermissionDto permissionDto = new PermissionDto();
            permissionDto.Name = permission.name;

            return permissionDto;
        }

        public static EspecialidadDto GetEspecialidadDto(Especialidad especialidad)
        {
            EspecialidadDto especialidadDto = new EspecialidadDto();
            especialidadDto.EspecialidadId = especialidad.especialidadId;
            especialidadDto.FinanciadorId = especialidad.financiadorId;
            especialidadDto.Nombre = especialidad.nombre;

            return especialidadDto;
        }

        public static PlanDto GetPlanDto(Plan plan)
        {
            PlanDto planDto = new PlanDto();
            planDto.PlanId = plan.planId;
            planDto.FinanciadorId = plan.financiadorId;
            planDto.Nombre = plan.nombre;

            return planDto;
        }

        public static ServicioGuardiaDto GetServicioGuardiaDto(ServicioGuardia servicioGuardia)
        {
            ServicioGuardiaDto servicioGuardiaDto = new ServicioGuardiaDto();
            servicioGuardiaDto.ServicioGuardiaId = servicioGuardia.servicioGuardiaId;
            servicioGuardiaDto.FinanciadorId = servicioGuardia.financiadorId;
            servicioGuardiaDto.Nombre = servicioGuardia.nombre;

            return servicioGuardiaDto;
        }

        public static ServicioEspecialDto GetServicioEspecialDto(ServicioEspecial servicioEspecial)
        {
            ServicioEspecialDto servicioEspecialDto = new ServicioEspecialDto();
            servicioEspecialDto.ServicioEspecialId = servicioEspecial.servicioEspecialId;
            servicioEspecialDto.Nombre = servicioEspecial.nombre;

            return servicioEspecialDto;
        }

        public static LocacionServicioEspecialDto GetLocacionServicioEspecialDto(LocacionServicioEspecial locacionServicioEspecial)
        {
            LocacionServicioEspecialDto locacionServicioEspecialDto = new LocacionServicioEspecialDto();
            locacionServicioEspecialDto.LocacionServicioEspecialId = locacionServicioEspecial.locacionServicioEspecialId;
            locacionServicioEspecialDto.FinanciadorId = locacionServicioEspecial.financiadorId;
            locacionServicioEspecialDto.Latitud = locacionServicioEspecial.latitud;
            locacionServicioEspecialDto.Longitud = locacionServicioEspecial.longitud;
            locacionServicioEspecialDto.Nombre = locacionServicioEspecial.nombre;
            locacionServicioEspecialDto.ProvinciaNombre = locacionServicioEspecial.departamento.provincia.nombre;
            locacionServicioEspecialDto.Telefono = locacionServicioEspecial.telefono;
            locacionServicioEspecialDto.Direccion = locacionServicioEspecial.direccion;
            locacionServicioEspecialDto.CodigoPostal = locacionServicioEspecial.codigoPostal;
            locacionServicioEspecialDto.DepartamentoNombre = locacionServicioEspecial.departamento.nombre;
            locacionServicioEspecialDto.ServicioEspecialNombre = locacionServicioEspecial.servicioespecial.nombre;
            
            return locacionServicioEspecialDto;
        }

        public static CentroAtencionDto GetCentroAtencionDto(CentroAtencion centroAtencion)
        {
            CentroAtencionDto centroAtencionDto = new CentroAtencionDto();
            centroAtencionDto.CentroAtencionId = centroAtencion.centroAtencionId;
            centroAtencionDto.FinanciadorId = centroAtencion.financiadorId;
            centroAtencionDto.Latitud = centroAtencion.latitud;
            centroAtencionDto.Longitud = centroAtencion.longitud;
            centroAtencionDto.Nombre = centroAtencion.nombre;
            centroAtencionDto.ProvinciaNombre = centroAtencion.departamento.provincia.nombre;
            centroAtencionDto.Telefono = centroAtencion.telefono;
            centroAtencionDto.Direccion = centroAtencion.direccion;
            centroAtencionDto.CodigoPostal = centroAtencion.codigoPostal;
            centroAtencionDto.DepartamentoNombre = centroAtencion.departamento.nombre;
            
            return centroAtencionDto;
        }

        public static SucursalPrestadorDto GetSucursalPrestadorDto(SucursalPrestador sucursalPrestador)
        {
            SucursalPrestadorDto sucursalPrestadorDto = new SucursalPrestadorDto();
            sucursalPrestadorDto.SucursalPrestadorId = sucursalPrestador.sucursalPrestadorId;
            sucursalPrestadorDto.Latitud = sucursalPrestador.latitud;
            sucursalPrestadorDto.Longitud = sucursalPrestador.longitud;
            sucursalPrestadorDto.Nombre = sucursalPrestador.nombre;
            sucursalPrestadorDto.ProvinciaNombre = sucursalPrestador.departamento.provincia.nombre;
            sucursalPrestadorDto.PrestadorNombre = sucursalPrestador.prestador.nombre;
            sucursalPrestadorDto.Telefono = sucursalPrestador.telefono;
            sucursalPrestadorDto.Direccion = sucursalPrestador.direccion;
            sucursalPrestadorDto.CodigoPostal = sucursalPrestador.codigoPostal;
            sucursalPrestadorDto.DepartamentoNombre = sucursalPrestador.departamento.nombre;
            return sucursalPrestadorDto;
        }

        public static SucursalPrestadorDto GetExtendedSucursalPrestadorDto(ExtendedSucursalPrestador sucursalPrestador)
        {
            SucursalPrestadorDto sucursalPrestadorDto = new SucursalPrestadorDto();
            sucursalPrestadorDto.SucursalPrestadorId = sucursalPrestador.sucursalPrestadorId;
            sucursalPrestadorDto.Latitud = sucursalPrestador.latitud;
            sucursalPrestadorDto.Longitud = sucursalPrestador.longitud;
            sucursalPrestadorDto.Nombre = sucursalPrestador.nombre;
            sucursalPrestadorDto.ProvinciaNombre = sucursalPrestador.departamento.provincia.nombre;
            sucursalPrestadorDto.PrestadorNombre = sucursalPrestador.prestador.nombre;
            sucursalPrestadorDto.Telefono = sucursalPrestador.telefono;
            sucursalPrestadorDto.Direccion = sucursalPrestador.direccion;
            sucursalPrestadorDto.CodigoPostal = sucursalPrestador.codigoPostal;
            sucursalPrestadorDto.DepartamentoNombre = sucursalPrestador.departamento.nombre;
            sucursalPrestadorDto.DistanciaAReferencia = sucursalPrestador.DistanciaAReferencia;
            return sucursalPrestadorDto;
        }

        public static CentroAtencionDto GetExtendedCentroAtencionDto(ExtendedCentroAtencion centroAtencion)
        {
            CentroAtencionDto centroAtencionDto = new CentroAtencionDto();
            centroAtencionDto.CentroAtencionId = centroAtencion.centroAtencionId;
            centroAtencionDto.Latitud = centroAtencion.latitud;
            centroAtencionDto.Longitud = centroAtencion.longitud;
            centroAtencionDto.Nombre = centroAtencion.nombre;
            centroAtencionDto.ProvinciaNombre = centroAtencion.departamento.provincia.nombre;
            centroAtencionDto.Telefono = centroAtencion.telefono;
            centroAtencionDto.Direccion = centroAtencion.direccion;
            centroAtencionDto.CodigoPostal = centroAtencion.codigoPostal;
            centroAtencionDto.DepartamentoNombre = centroAtencion.departamento.nombre;
            centroAtencionDto.DistanciaAReferencia = centroAtencion.DistanciaAReferencia;
            return centroAtencionDto;
        }


        public static GuardiaSucursalPrestadorDto GetGuardiaSucursalPrestadorDto(GuardiaSucursalPrestador guardiaSucursalPrestador)
        {
            GuardiaSucursalPrestadorDto guardiaSucursalPrestadorDto = new GuardiaSucursalPrestadorDto();
            guardiaSucursalPrestadorDto.GuardiaSucursalPrestadorId = guardiaSucursalPrestador.guardiaSucursalPrestadorId;
            guardiaSucursalPrestadorDto.Latitud = guardiaSucursalPrestador.sucursalprestador.latitud;
            guardiaSucursalPrestadorDto.Longitud = guardiaSucursalPrestador.sucursalprestador.longitud;
            guardiaSucursalPrestadorDto.Nombre = guardiaSucursalPrestador.sucursalprestador.nombre;
            guardiaSucursalPrestadorDto.ProvinciaNombre = guardiaSucursalPrestador.sucursalprestador.departamento.provincia.nombre;
            guardiaSucursalPrestadorDto.PrestadorNombre = guardiaSucursalPrestador.sucursalprestador.prestador.nombre;
            guardiaSucursalPrestadorDto.Telefono = guardiaSucursalPrestador.telefono;
            guardiaSucursalPrestadorDto.Direccion = guardiaSucursalPrestador.sucursalprestador.direccion;
            guardiaSucursalPrestadorDto.CodigoPostal = guardiaSucursalPrestador.sucursalprestador.codigoPostal;
            guardiaSucursalPrestadorDto.DepartamentoNombre = guardiaSucursalPrestador.sucursalprestador.departamento.nombre;

            return guardiaSucursalPrestadorDto;
        }

        public static GuardiaSucursalPrestadorDto GetExtendedGuardiaSucursalPrestadorDto(ExtendedGuardiaSucursalPrestador guardiaSucursalPrestador)
        {
            GuardiaSucursalPrestadorDto guardiaSucursalPrestadorDto = new GuardiaSucursalPrestadorDto();
            guardiaSucursalPrestadorDto.GuardiaSucursalPrestadorId = guardiaSucursalPrestador.guardiaSucursalPrestadorId;
            guardiaSucursalPrestadorDto.Latitud = guardiaSucursalPrestador.sucursalprestador.latitud;
            guardiaSucursalPrestadorDto.Longitud = guardiaSucursalPrestador.sucursalprestador.longitud;
            guardiaSucursalPrestadorDto.Nombre = guardiaSucursalPrestador.sucursalprestador.nombre;
            guardiaSucursalPrestadorDto.ProvinciaNombre = guardiaSucursalPrestador.sucursalprestador.departamento.provincia.nombre;
            guardiaSucursalPrestadorDto.PrestadorNombre = guardiaSucursalPrestador.sucursalprestador.prestador.nombre;
            guardiaSucursalPrestadorDto.Telefono = guardiaSucursalPrestador.telefono;
            guardiaSucursalPrestadorDto.Direccion = guardiaSucursalPrestador.sucursalprestador.direccion;
            guardiaSucursalPrestadorDto.CodigoPostal = guardiaSucursalPrestador.sucursalprestador.codigoPostal;
            guardiaSucursalPrestadorDto.DepartamentoNombre = guardiaSucursalPrestador.sucursalprestador.departamento.nombre;
            guardiaSucursalPrestadorDto.DistanciaAReferencia = guardiaSucursalPrestador.DistanciaAReferencia;

            return guardiaSucursalPrestadorDto;
        }

        public static ProvinciaDto GetProvinciaDto(Provincia provincia)
        {
            ProvinciaDto provinciaDto = new ProvinciaDto();
            provinciaDto.ProvinciaId = provincia.provinciaId;
            provinciaDto.Nombre = provincia.nombre;
            provinciaDto.PaisNombre = provincia.pais.nombre;
            
            return provinciaDto;
        }

        public static DepartamentoDto GetDepartamentoDto(Departamento departamento)
        {
            DepartamentoDto departamentoDto = new DepartamentoDto();
            departamentoDto.DepartamentoId = departamento.departamentoId;
            departamentoDto.Nombre = departamento.nombre;
            departamentoDto.ProvinciaNombre = departamento.provincia.nombre;

            return departamentoDto;
        }

        public static ServerDto GetServerDto(Server server)
        {
            ServerDto serverDto = new ServerDto();
            serverDto.ServerId = server.serverId;
            serverDto.Name = server.name;
            serverDto.Url = server.url;
            serverDto.IpAddress = server.ipAddress;

            return serverDto;
        }

        public static PlatformDto GetPlatformDto(Platform platform)
        {
            PlatformDto platformDto = new PlatformDto();
            platformDto.PlatformId = platform.platformId;
            platformDto.PlatformName = platform.name;
            platformDto.VersionNumber = platform.currentVersion;
            platformDto.VersionUrl = platform.versionUrl;

            return platformDto;
        }

        public static CentroAtencionDto[] GetCentroAtencionDtoArray(List<CentroAtencion> centroAtencionList)
        {
            List<CentroAtencionDto> centroAtencionDtoList = new List<CentroAtencionDto>();

            foreach (CentroAtencion centroAtencion in centroAtencionList)
            {
                CentroAtencionDto centroAtencionDto = EntityTranslator.GetCentroAtencionDto(centroAtencion);

                centroAtencionDtoList.Add(centroAtencionDto);
            }

            return centroAtencionDtoList.ToArray();
        }

        public static CentroAtencionDto[] GetExtendedCentroAtencionDtoArray(List<ExtendedCentroAtencion> centroAtencionList)
        {
            List<CentroAtencionDto> centroAtencionDtoList = new List<CentroAtencionDto>();

            foreach (ExtendedCentroAtencion centroAtencion in centroAtencionList)
            {
                CentroAtencionDto centroAtencionDto = EntityTranslator.GetExtendedCentroAtencionDto(centroAtencion);

                centroAtencionDtoList.Add(centroAtencionDto);
            }

            return centroAtencionDtoList.ToArray();
        }

        public static LocacionServicioEspecialDto[] GetLocacionServicioEspecialDtoArray(List<LocacionServicioEspecial> locacionServicioEspecialList)
        {
            List<LocacionServicioEspecialDto> locacionServicioEspecialDtoList = new List<LocacionServicioEspecialDto>();

            foreach (LocacionServicioEspecial locacionServicioEspecial in locacionServicioEspecialList)
            {
                LocacionServicioEspecialDto locacionServicioEspecialDto = EntityTranslator.GetLocacionServicioEspecialDto(locacionServicioEspecial);

                locacionServicioEspecialDtoList.Add(locacionServicioEspecialDto);
            }

            return locacionServicioEspecialDtoList.ToArray();
        }

        public static SucursalPrestadorDto[] GetSucursalPrestadorDtoArray(List<SucursalPrestador> sucursalPrestadorList)
        {
            List<SucursalPrestadorDto> sucursalPrestadorDtoList = new List<SucursalPrestadorDto>();

            foreach (SucursalPrestador sucursalPrestador in sucursalPrestadorList)
            {
                SucursalPrestadorDto sucursalPrestadorDto = EntityTranslator.GetSucursalPrestadorDto(sucursalPrestador);

                sucursalPrestadorDtoList.Add(sucursalPrestadorDto);
            }

            return sucursalPrestadorDtoList.ToArray();
        }

        public static SucursalPrestadorDto[] GetExtendedSucursalPrestadorDtoArray(List<ExtendedSucursalPrestador> sucursalPrestadorList)
        {
            List<SucursalPrestadorDto> sucursalPrestadorDtoList = new List<SucursalPrestadorDto>();

            foreach (ExtendedSucursalPrestador sucursalPrestador in sucursalPrestadorList)
            {
                SucursalPrestadorDto sucursalPrestadorDto = EntityTranslator.GetExtendedSucursalPrestadorDto(sucursalPrestador);

                sucursalPrestadorDtoList.Add(sucursalPrestadorDto);
            }

            return sucursalPrestadorDtoList.ToArray();
        }

        public static GuardiaSucursalPrestadorDto[] GetGuardiaSucursalPrestadorDtoArray(List<GuardiaSucursalPrestador> guardiaSucursalPrestadorList)
        {
            List<GuardiaSucursalPrestadorDto> guardiaSucursalPrestadorDtoList = new List<GuardiaSucursalPrestadorDto>();

            foreach (GuardiaSucursalPrestador guardiaSucursalPrestador in guardiaSucursalPrestadorList)
            {
                GuardiaSucursalPrestadorDto guardiaSucursalPrestadorDto = EntityTranslator.GetGuardiaSucursalPrestadorDto(guardiaSucursalPrestador);

                guardiaSucursalPrestadorDtoList.Add(guardiaSucursalPrestadorDto);
            }

            return guardiaSucursalPrestadorDtoList.ToArray();
        }

        public static GuardiaSucursalPrestadorDto[] GetExtendedGuardiaSucursalPrestadorDtoArray(List<ExtendedGuardiaSucursalPrestador> guardiaSucursalPrestadorList)
        {
            List<GuardiaSucursalPrestadorDto> guardiaSucursalPrestadorDtoList = new List<GuardiaSucursalPrestadorDto>();

            foreach (ExtendedGuardiaSucursalPrestador extendedGuardiaSucursalPrestador in guardiaSucursalPrestadorList)
            {
                GuardiaSucursalPrestadorDto guardiaSucursalPrestadorDto = EntityTranslator.GetExtendedGuardiaSucursalPrestadorDto(extendedGuardiaSucursalPrestador);

                guardiaSucursalPrestadorDtoList.Add(guardiaSucursalPrestadorDto);
            }

            return guardiaSucursalPrestadorDtoList.ToArray();
        }

        public static PermissionDto[] GetPermissionDtoArray(List<Permission> permissionList)
        {
            List<PermissionDto> permissionDtoList = new List<PermissionDto>();

            foreach (Permission permission in permissionList)
            {
                PermissionDto permissionDto = EntityTranslator.GetPermissionDto(permission);
                
                permissionDtoList.Add(permissionDto);
            }

            return permissionDtoList.ToArray();
        }

        public static EspecialidadDto[] GetEspecialidadDtoArray(List<Especialidad> especialidadesFinanciador)
        {
            List<EspecialidadDto> especialidadDtoList = new List<EspecialidadDto>();

            foreach (Especialidad especialidad in especialidadesFinanciador)
            {
                EspecialidadDto especialidadDto = EntityTranslator.GetEspecialidadDto(especialidad);

                especialidadDtoList.Add(especialidadDto);
            }

            return especialidadDtoList.ToArray();
        }

        public static PlanDto[] GetPlanDtoArray(List<Plan> planesFinanciador)
        {
            List<PlanDto> planDtoList = new List<PlanDto>();

            foreach (Plan plan in planesFinanciador)
            {
                PlanDto planDto = EntityTranslator.GetPlanDto(plan);

                planDtoList.Add(planDto);
            }

            return planDtoList.ToArray();
        }

        public static ServicioGuardiaDto[] GetServicioGuardiaDtoArray(List<ServicioGuardia> serviciosGuardiaFinanciador)
        {
            List<ServicioGuardiaDto> servicioGuardiaDtoList = new List<ServicioGuardiaDto>();

            foreach (ServicioGuardia servicioGuardia in serviciosGuardiaFinanciador)
            {
                ServicioGuardiaDto servicioGuardiaDto = EntityTranslator.GetServicioGuardiaDto(servicioGuardia);

                servicioGuardiaDtoList.Add(servicioGuardiaDto);
            }

            return servicioGuardiaDtoList.ToArray();
        }

        public static ServicioEspecialDto[] GetServicioEspecialDtoArray(List<ServicioEspecial> serviciosEspecialesFinanciador)
        {
            List<ServicioEspecialDto> servicioEspecialDtoList = new List<ServicioEspecialDto>();

            foreach (ServicioEspecial servicioEspecial in serviciosEspecialesFinanciador)
            {
                ServicioEspecialDto servicioEspecialDto = EntityTranslator.GetServicioEspecialDto(servicioEspecial);

                servicioEspecialDtoList.Add(servicioEspecialDto);
            }

            return servicioEspecialDtoList.ToArray();
        }

        public static ProvinciaDto[] GetProvinciaDtoArray(List<Provincia> provinciaList)
        {
            List<ProvinciaDto> provinciaDtoList = new List<ProvinciaDto>();

            foreach (Provincia provincia in provinciaList)
            {
                ProvinciaDto provinciaDto = EntityTranslator.GetProvinciaDto(provincia);

                provinciaDtoList.Add(provinciaDto);
            }

            return provinciaDtoList.ToArray();
        }

        public static DepartamentoDto[] GetDepartamentoDtoArray(List<Departamento> departamentoList)
        {
            List<DepartamentoDto> departamentoDtoList = new List<DepartamentoDto>();

            foreach (Departamento departamento in departamentoList)
            {
                DepartamentoDto departamentoDto = EntityTranslator.GetDepartamentoDto(departamento);

                departamentoDtoList.Add(departamentoDto);
            }

            return departamentoDtoList.ToArray();
        }

        public static ServerDto[] GetServerDtoArray(List<Server> serverList)
        {
            List<ServerDto> serverDtoList = new List<ServerDto>();

            foreach (Server server in serverList)
            {
                ServerDto serverDto = EntityTranslator.GetServerDto(server);

                serverDtoList.Add(serverDto);
            }

            return serverDtoList.ToArray();
        }
    }
}